#include "ThreadRecibidor.h"

#include "InterfazPeer.h"

ThreadRecibidor::ThreadRecibidor(InterfazPeer *interfaz, Conexion *conexion, Protocolo *protocolo, Condition *conditionCLlegada, queue<Respuesta*> *colaLlegada )
{
	this->interfaz = interfaz;
	this->conexion = conexion;
	this->protocolo = protocolo;
	this->conditionCLlegada = conditionCLlegada;
	this->colaLlegada = colaLlegada;
}

ThreadRecibidor::~ThreadRecibidor()
{
}

void* ThreadRecibidor::run()
{
	cout << "Thread Recibidor " << this->interfaz->getPeerId() << endl;
	bool recibirOk = true;
	string aux;
	Respuesta *respuesta = NULL;

	while((!this->getStop()) && recibirOk){
		aux = "";

		recibirOk = this->conexion->recibir(aux);

		if(recibirOk){
			respuesta = protocolo->procesar(aux);

			if(respuesta != NULL){

				respuesta->setPeerId(this->interfaz->getPeerId());

				this->conditionCLlegada->mutexLock();

				this->colaLlegada->push(respuesta);

				if(colaLlegada->size() == 1){
					this->conditionCLlegada->signal();
				}

				this->conditionCLlegada->mutexUnlock();
			}
		}
	}

	this->interfaz->enviarSenialNoActivo();

	return NULL;
}

void ThreadRecibidor::stop(){
	//TODO ver si hace falta hacer un shutdown. En teoria desconecta el enviarSerialNoActivado
	this->Thread::stop();
}

